<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>12_Promise-Promise类方法all方法</title>
  <!-- 
  在 JavaScript 中， `Promise.all`  方法是一个静态方法，用于将多个  `Promise`  实例包装成一个新的  `Promise` 。这个新  `Promise`  在所有传入的  `Promise`  都成功时才会成功，或者在其中一个  `Promise`  失败时立即失败。
  1. 基本概念
  - ** `Promise.all(iterable)` **：接收一个可迭代对象（通常是数组），该对象包含多个  `Promise`  实例。
  - 该方法返回一个新的  `Promise` ，该  `Promise`  的状态由传入的  `Promise`  决定。

  2. 语法
  Promise.all(iterable);
  -  `iterable` ：一个可迭代对象，通常是一个数组，包含多个  `Promise`  对象。

  3. 返回值
  - 返回一个新的  `Promise` ：
    - 如果所有传入的  `Promise`  都成功，新的  `Promise`  成功，返回一个包含所有结果的数组。
    - 如果任意一个  `Promise`  失败，新的  `Promise`  立即失败，返回第一个失败的  `Promise`  的拒绝理由。

  4. 示例代码

  4.1 所有  `Promise`  成功
  const promise1 = Promise.resolve(1);
  const promise2 = Promise.resolve(2);
  const promise3 = Promise.resolve(3);

  Promise.all([promise1, promise2, promise3])
      .then(results => {
          console.log(results); // 输出: [1, 2, 3]
      })
      .catch(error => {
          console.error(error);
      });
  4.2 任意一个  `Promise`  失败
  const promise4 = Promise.resolve(1);
  const promise5 = Promise.reject('Error occurred');
  const promise6 = Promise.resolve(3);

  Promise.all([promise4, promise5, promise6])
      .then(results => {
          console.log(results);
      })
      .catch(error => {
          console.error(error); // 输出: Error occurred
      });
  5. 注意事项
  -  `Promise.all`  只会等待所有的  `Promise`  完成（成功或失败），并不会等待非  `Promise`  的值。
  - 如果传入的 iterable 中包含非  `Promise`  的值，它们会被自动转换为已解决的  `Promise` 。
  -  `Promise.all`  的执行是并行的，所有的  `Promise`  会同时开始执行，而不是一个接一个地执行。

  6. 总结
  `Promise.all`  是处理多个  `Promise`  的非常有用的方法，允许你在所有异步操作完成后统一处理结果。理解  `Promise.all`  的用法可以帮助开发者更有效地管理异步操作，尤其是在需要同时进行多个异步请求时。
  -->
</head>
<body>

  <script>
    // Promise.all方法
    const p1 = new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('p1')
      }, 1000)
    })

    const p2 = new Promise((resolve, reject) => {
      setTimeout(() => {
        reject('reject p2 出错了全完')
      }, 2000)
    })

    const p3 = new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('p3')
      }, 3000)
    })

    // Promise.all方法接收一个数组，数组中是多个Promise实例, 如果有错误，则返回第一个错误, 如果全部成功，则返回一个数组
    Promise.all([p1, p2, p3]).then(res => {
      console.log("Promise.all resolve", res)
    }).catch(err => {
      console.log("Promise.all reject", err)
    })

    Promise.all([p1, p3]).then(res => {
      console.log("Promise.all resolve", res)
    }).catch(err => {
      console.log("Promise.all reject", err)
    })

  </script>
  
</body>
</html>